package com.hxzy.config.interceptor;

import cn.hutool.json.JSONUtil;

import com.hxzy.common.annon.RepeatSubmit;
import com.hxzy.common.enums.AckCode;
import com.hxzy.common.util.ServletUtils;
import com.hxzy.common.vo.R;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 使用redis判断是否是在某个时间点之内(10s)，是否重复提交
 * 注解给 springmvc，告诉它这个拦截器
 */
public abstract class AbstractRepeatSubmitInterceptor implements HandlerInterceptor {

    /**
     * 执行Controller方法的之前，做是否重复提交的验证
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod){
            RepeatSubmit repeatSubmit= ((HandlerMethod)handler).getMethodAnnotation(RepeatSubmit.class);

            // 如果这个请求肯定是 要判断是不是重复提交
            if( repeatSubmit!=null ){

                //是重复提交
                if (this.isRepeatSubmit(request, repeatSubmit))
                {
                    R r= R.build(AckCode.FAIL);
                    r.setMsg( repeatSubmit.message());

                    ServletUtils.renderString(response, JSONUtil.toJsonStr(r));
                    return false;
                }
            }
        }

        //不是重复提交，或直接放行
         return true;
    }

    /**
     * 使用redis来做存储
     *   hash 来存储  key   来存储 当前的时间      以及参数
     * @param request
     * @param repeatSubmit
     * @return  true代表重复提交，false不是重复提示
     */
    protected abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit repeatSubmit);
}
